package io.github.echarts.model.component;

import io.github.echarts.model.geometry.Rectangle;

/**
 * 图表组件基类
 * 为所有图表组件（如标题、图例、坐标轴等）提供基本属性和行为
 */
public abstract class Component {
    
    /** 组件ID */
    protected String id;
    
    /** 组件类型 */
    protected ComponentType type;
    
    /** 组件布局区域 */
    protected Rectangle layoutArea;
    
    /** 组件是否可见 */
    protected boolean visible = true;
    
    /** 组件Z轴层级 */
    protected int zLevel = 0;
    
    /** 组件内部Z轴层级 */
    protected int z = 0;
    
    /**
     * 构造函数
     * 
     * @param type 组件类型
     */
    public Component(ComponentType type) {
        this.type = type;
        this.id = type.name() + "-" + System.currentTimeMillis();
    }
    
    /**
     * 获取组件ID
     * 
     * @return 组件ID
     */
    public String getId() {
        return id;
    }
    
    /**
     * 获取组件类型
     * 
     * @return 组件类型
     */
    public ComponentType getType() {
        return type;
    }
    
    /**
     * 设置组件布局区域
     * 
     * @param layoutArea 布局区域
     */
    public void setLayoutArea(Rectangle layoutArea) {
        this.layoutArea = layoutArea;
    }
    
    /**
     * 获取组件布局区域
     * 
     * @return 布局区域
     */
    public Rectangle getLayoutArea() {
        return layoutArea;
    }
    
    /**
     * 设置组件可见性
     * 
     * @param visible 是否可见
     */
    public void setVisible(boolean visible) {
        this.visible = visible;
    }
    
    /**
     * 获取组件可见性
     * 
     * @return 是否可见
     */
    public boolean isVisible() {
        return visible;
    }
    
    /**
     * 设置组件Z轴层级
     * 
     * @param zLevel Z轴层级
     */
    public void setZLevel(int zLevel) {
        this.zLevel = zLevel;
    }
    
    /**
     * 获取组件Z轴层级
     * 
     * @return Z轴层级
     */
    public int getZLevel() {
        return zLevel;
    }
    
    /**
     * 设置组件内部Z轴层级
     * 
     * @param z 内部Z轴层级
     */
    public void setZ(int z) {
        this.z = z;
    }
    
    /**
     * 获取组件内部Z轴层级
     * 
     * @return 内部Z轴层级
     */
    public int getZ() {
        return z;
    }
    
    /**
     * 计算组件所需的空间
     * 子类需要实现此方法以计算自身所需的空间大小
     * 
     * @return 所需的空间矩形
     */
    public abstract Rectangle calculateRequiredSpace();
    
    /**
     * 初始化组件
     * 在渲染前进行必要的初始化工作
     */
    public abstract void initialize();
} 